#ifndef __M_ONLINE_USER_H__
#define __M_ONLINE_USER_H__

#include "util.hpp"
#include <unordered_map>

class online_user
{
public:
    /* 进入游戏大厅or房间——websocket连接建立的时候才会将用户加入游戏大厅or游戏房间的在线用户管理 */
    void enter_hall(const uint64_t uid, wsserver_t::connection_ptr &conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.insert(std::make_pair(uid, conn));
    }
    void enter_room(const uint64_t uid, wsserver_t::connection_ptr &conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.insert(std::make_pair(uid, conn));
    }
    /* 从大厅or房间中移除用户——websocket连接断开的时候才会将用户从游戏大厅or游戏房间的在线用户管理移除 */
    void exit_hall(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _hall_user.erase(uid);
    }
    void exit_room(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_user.erase(uid);
    }
    /* 判断当前用户是否在游戏大厅or房间 */
    bool is_in_hall(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if (it == _hall_user.end())
            return false;
        return true;
    }
    bool is_in_room(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if (it == _room_user.end())
            return false;
        return true;
    }
    /* 通过用户id在游戏大厅or房间获取的在线用户管理中获取对应的通信连接 */
    wsserver_t::connection_ptr get_conn_from_hall(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if (it == _hall_user.end())
            return wsserver_t::connection_ptr();

        return it->second;
    }
    wsserver_t::connection_ptr get_conn_from_room(const uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if (it == _room_user.end())
            return wsserver_t::connection_ptr();

        return it->second;
    }

private:
    std::unordered_map<uint64_t, wsserver_t::connection_ptr> _hall_user; // 建立游戏大厅中的用户的id与通信连接的关系
    std::unordered_map<uint64_t, wsserver_t::connection_ptr> _room_user; // 建立游戏房间中的用户的id与通信连接的关系
    std::mutex _mutex;
};

#endif